﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
using System.Xml.Linq;

using BodaNetCommunications.Nodes;
using BodaNetCommunications.Utilities.ComTypes;

namespace BodaNetCommunications.ModbusTcpComs
{
    //
    // 摘要:
    //     NodeModbusTCP节点对象
    public class BodaNodeModbusTcp : ModbusNode, IXmlConvert
    {
        public CancellationTokenSource cts;

        //
        // 摘要:
        //     计时器
        public Stopwatch sw = new Stopwatch();

        //
        // 摘要:
        //     ModbusTCP通信对象
        public BodaModbusTcpClient Modtcp;

        //
        // 摘要:
        //     第一次连接
        public bool FirstConnect { get; set; }

        //
        // 摘要:
        //     通信速率
        public long CommRate { get; set; }

        //
        // 摘要:
        //     IP地址
        public string ServerURL { get; set; }

        //
        // 摘要:
        //     端口号
        public int Port { get; set; }

        //
        // 摘要:
        //     从站地址
        public int SlaveAddress { get; set; }

        //
        // 摘要:
        //     连接状态
        public bool IsConnected { get; set; }

        /// <summary>
        /// 获取或设置起始的地址是否从0开始，默认为True
        /// </summary>
        /// <remarks>
        /// <note type="warning">因为有些设备的起始地址是从1开始的，就要设置本属性为<c>Flase</c></note>
        /// </remarks>
        public bool AddressStartWithZero { get; set; }

        /// <summary>
        /// 字符串数据是否按照字来反转
        /// </summary>
        /// <remarks>
        /// 字符串按照2个字节的排列进行颠倒，根据实际情况进行设置
        /// </remarks>
        public bool IsStringReverse { get; set; }

        //
        // 摘要:
        //     字节顺序
        public EndianType DataFormat { get; set; }

        //
        // 摘要:
        //     NodeModbusTCP节点对象
        public BodaNodeModbusTcp()
        {
            Name = "Modbus TCP Client";
            Description = "1#软水系统";
            ModbusType = 2000;
            ServerURL = "127.0.0.1";
            Port = 502;
            FirstConnect = true;
        }

        //
        // 摘要:
        //     从XML元素对象中获取对象属性
        //
        // 参数:
        //   element:
        public override void LoadByXmlElement(XElement element)
        {
            base.LoadByXmlElement(element);
            ServerURL = element.Attribute("ServerURL").Value;
            Port = int.Parse(element.Attribute("Port").Value);
            DataFormat = (EndianType)Enum.Parse(typeof(EndianType), element.Attribute("DataFormat").Value, ignoreCase: true);
        }

        //
        // 摘要:
        //     将对象属性保存至XML元素对象
        public override XElement ToXmlElement()
        {
            XElement xElement = base.ToXmlElement();
            xElement.SetAttributeValue("ServerURL", ServerURL);
            xElement.SetAttributeValue("Port", Port);
            xElement.SetAttributeValue("DataFormat", DataFormat);
            return xElement;
        }

        //
        // 摘要:
        //     获取用于在数据表信息中显示的键值数据对信息
        //
        // 返回结果:
        //     键值数据对列表
        public override List<BodaNodeClassRenderItem> GetNodeClassRenders()
        {
            List<BodaNodeClassRenderItem> nodeClassRenders = base.GetNodeClassRenders();
            nodeClassRenders.Add(new BodaNodeClassRenderItem("IP地址", ServerURL));
            nodeClassRenders.Add(new BodaNodeClassRenderItem("端口号", Port.ToString()));
            nodeClassRenders.Add(new BodaNodeClassRenderItem("数据格式", DataFormat.ToString()));
            nodeClassRenders.Add(new BodaNodeClassRenderItem("激活情况", IsActive ? "已激活" : "未激活"));
            nodeClassRenders.Add(new BodaNodeClassRenderItem("连接情况", IsConnected ? "已连接" : "未连接"));
            if (IsConnected)
            {
                nodeClassRenders.Add(new BodaNodeClassRenderItem("通信速率", CommRate.ToString()));
            }

            return nodeClassRenders;
        }
    }
}